// color util
export const rgb2hsl = function (r, g, b) {
    r /= 255, g /= 255, b /= 255;
    var max = Math.max(r, g, b),
        min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2;

    if (max == min) {
        h = s = 0; // achromatic
    } else {
        var d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch (max) {
            case r:
                h = (g - b) / d + (g < b ? 6 : 0);
                break;
            case g:
                h = (b - r) / d + 2;
                break;
            case b:
                h = (r - g) / d + 4;
                break;
        }
        h /= 6;
    }
    return [h, s, l];
}

export const rgbColor2Hsl = function (
    rgbColor) {
    const ca = rgbColorArrayWithRgbColor(rgbColor);
    if (ca.length !== 3) {
        return;
    }
    let r = Number(ca[0]);
    let g = Number(ca[1]);
    let b = Number(ca[2]);
    r /= 255, g /= 255, b /= 255;
    var max = Math.max(r, g, b),
        min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2;

    if (max == min) {
        h = s = 0; // achromatic
    } else {
        var d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch (max) {
            case r:
                h = (g - b) / d + (g < b ? 6 : 0);
                break;
            case g:
                h = (b - r) / d + 2;
                break;
            case b:
                h = (r - g) / d + 4;
                break;
        }
        h /= 6;
    }
    return [h, s, l];
}

export const hslToRgb = function (h, s, l) {
    var r, g, b;
    if (s == 0) {
        r = g = b = l; // achromatic
    } else {
        var hue2rgb = function hue2rgb(p, q, t) {
            if (t < 0) t += 1;
            if (t > 1) t -= 1;
            if (t < 1 / 6) return p + (q - p) * 6 * t;
            if (t < 1 / 2) return q;
            if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
            return p;
        }
        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
        var p = 2 * l - q;
        r = hue2rgb(p, q, h + 1 / 3);
        g = hue2rgb(p, q, h);
        b = hue2rgb(p, q, h - 1 / 3);
    }
    return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}

export function HSVtoRGB(h, s, v) {
    let i, f, p1, p2, p3;
    let r = 0, g = 0, b = 0;
    if (s < 0) s = 0;
    if (s > 1) s = 1;
    if (v < 0) v = 0;
    if (v > 1) v = 1;
    h %= 360;
    if (h < 0) h += 360;
    h /= 60;
    i = Math.floor(h);
    f = h - i;
    p1 = v * (1 - s);
    p2 = v * (1 - s * f);
    p3 = v * (1 - s * (1 - f));
    switch (i) {
        case 0:
            r = v;
            g = p3;
            b = p1;
            break;
        case 1:
            r = p2;
            g = v;
            b = p1;
            break;
        case 2:
            r = p1;
            g = v;
            b = p3;
            break;
        case 3:
            r = p1;
            g = p2;
            b = v;
            break;
        case 4:
            r = p3;
            g = p1;
            b = v;
            break;
        case 5:
            r = v;
            g = p1;
            b = p2;
            break;
    }
    //向上取整

    return 'rgb(' + Math.ceil(r * 255) + ',' + Math.ceil(g * 255) + ',' + Math.ceil(b * 255) + ')';
}
// r,g,b范围为[0,255],转换成h范围为[0,360]
// s,v为百分比形式，范围是[0,100],可根据需求做相应调整
export function rgbtohsv(r,g,b){
    r=r/255;
    g=g/255;
    b=b/255;
    var h,s,v;
    var min=Math.min(r,g,b);
    var max=v=Math.max(r,g,b);
    var l=(min+max)/2;
    var difference = max-min;

    if(max==min){
        h=0;
    }else{
        switch(max){
            case r: h=(g-b)/difference+(g < b ? 6 : 0);break;
            case g: h=2.0+(b-r)/difference;break;
            case b: h=4.0+(r-g)/difference;break;
        }
        h=Math.round(h*60);
    }
    if(max==0){
        s=0;
    }else{
        s=1-min/max;
    }
    s=Math.round(s*100);
    v=Math.round(v*100);
    return [h,s,v];
}



export const colorHex = function (color) {
    var that = color;
    //十六进制颜色值的正则表达式
    var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
    // 如果是rgb颜色表示
    if (/^(rgb|RGB)/.test(that)) {
        var aColor = that.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
        var strHex = "#";
        for (var i = 0; i < aColor.length; i++) {
            var hex = Number(aColor[i]).toString(16);
            if (hex.length < 2) {
                hex = '0' + hex;
            }
            strHex += hex;
        }
        if (strHex.length !== 7) {
            strHex = that;
        }
        return strHex;
    } else if (reg.test(that)) {
        var aNum = that.replace(/#/, "").split("");
        if (aNum.length === 6) {
            return that;
        } else if (aNum.length === 3) {
            var numHex = "#";
            for (var i = 0; i < aNum.length; i += 1) {
                numHex += (aNum[i] + aNum[i]);
            }
            return numHex;
        }
    }
    return that;
}

export const colorRgb = function (hexColor) {
    // 16进制颜色值的正则
    var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
    // 把颜色值变成小写
    var color = hexColor.toLowerCase();
    if (reg.test(color)) {
        // 如果只有三位的值，需变成六位，如：#fff => #ffffff
        if (color.length === 4) {
            var colorNew = "#";
            for (var i = 1; i < 4; i += 1) {
                colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1));
            }
            color = colorNew;
        }
        // 处理六位的颜色值，转为RGB
        var colorChange = [];
        for (var i = 1; i < 7; i += 2) {
            colorChange.push(parseInt("0x" + color.slice(i, i + 2)));
        }
        return colorChange;
    } else {
        return color;
    }
}

export const rgbColorArrayWithRgbColor = function (rgbColor) {
    // 如果是rgb颜色表示
    if (/^(rgb|RGB)/.test(rgbColor)) {
        var aColor = rgbColor.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
        return aColor;
    }
    return rgbColor;
}

export function getHue(rgbArray) {
    let r, g, b, max, min;
    r = parseInt(rgbArray[0]);
    g = parseInt(rgbArray[1]);
    b = parseInt(rgbArray[2]);
    max = Math.max(r, g, b)
    min = Math.min(r, g, b)
    if (max == min) {
        return 0;
    } else {
        if (max == r && g >= b) {
            return 60 * (g - b) / (max - min);
        } else if (max == r && g < b) {
            return 60 * (g - b) / (max - min) + 360;
        } else if (max == g) {
            return 60 * (b - r) / (max - min) + 120;
        } else if (max == b) {
            return 60 * (r - g) / (max - min) + 240;
        }
    }
}


export function debounce(fn, delay) {
	var timer;
	return function(e) {
		timer && clearTimeout(timer);
		timer = setTimeout(() => {
			fn.apply(this, arguments)
		}, delay);
	}
}

export function throttle(fn, delay) {
	var valid = true;
	return function(e) {
		if (!valid) {
			return;
		}
		valid = false;
		setTimeout(() => {
			valid = true;
			fn(this, e);
		}, delay);
	}
}

export function hue2RGB(h) {
	let doHandle = (num) =>{
		if( num > 255) {
			return 255;
		} else if(num < 0){
			return 0;
		} else {
			return Math.round(num);
		}
	}

	let hueRGB = h/60 * 255;
	let r = doHandle(Math.abs(hueRGB-765)-255);
	let g = doHandle(510 - Math.abs(hueRGB-510));
	let b = doHandle(510 - Math.abs(hueRGB-1020));
	return 'rgb(' +r + ',' + g + ',' + b + ')';
}

export function rgb2Hex (color){
	if(color.indexOf("#") != -1) {
		return color;
	}
	let arr = color.split(',');
	let r = +arr[0].split('(')[1];
	let g = +arr[1];
	let b = +arr[2].split(')')[0];
	let value = (1 << 24) + r * (1 << 16) + g * (1 << 8) + b;
	value = value.toString(16);
	return '#' + value.slice(1);
}


